/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.objetos;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.DateFormat;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Locale;

/**
 *
 * @author KOMATSU
 */
public class MesaMetodos {
    private Mesa m = new Mesa();
    
    private String tipoProduto = "";
    
    private String qtd="";
    
    private List listaMesa = new ArrayList();
    
    private List listaProduto = new ArrayList();
    
    private List listaPedidos = new ArrayList();
    
    private List listaGarcom = new ArrayList();
    
    private String mensagem = "";
    
    private String cpf = "";
    
    private String tipoPag = "";
    
    private int idCliente ;
    
    /**
     *
     * Metodo Buscar Pedidos
     * Pega Pedidos do banco
     * de acordo com o filtro
     * feito na sql
    */
    
    public void buscarPedidos() {
        Conexao con = new Conexao();
        try {
            
            con.inicia();
            String query = "SELECT * FROM bars.conta "
                    + "where idmesa="+getM().getIdMesa();
            ResultSet rs = con.executa(query);
            String idConta="";
            while (rs.next()) {
                idConta=rs.getString("idconta");
            }
            rs.close();
            query = "SELECT * FROM bars.pedido NATURAL JOIN bars.produto "
                    + "WHERE idconta = "+idConta;
            rs = con.executa(query);
            listaPedidos.clear();
            while (rs.next()) {
                Pedido p = new Pedido();
                p.setIdPedido(Integer.toString(rs.getInt("idpedido")));
                p.setQtde(Integer.toString(rs.getInt("qtde")));
                p.getProduto().setTipo(rs.getString("tipo"));
                DecimalFormat df = new DecimalFormat ("#,##0.00", new DecimalFormatSymbols (new Locale ("pt", "BR"))); 
                p.setPreco(df.parse(rs.getString("preco")).doubleValue());
                listaPedidos.add(p);
            }
            
            rs.close();
        } catch (Exception e) {
            this.setMensagem(e.getMessage());
            System.out.println(e.getMessage());
        } finally {
            try {
                con.encerra();
            } catch (SQLException closeE) {
                this.setMensagem(closeE.getMessage());
            }
        }
    }
    
    /**
     *
     * Metodo Buscar Produtos
     * Pega Produtos do banco
    */
    
    public void buscarProdutos(){
        try {
            ProdutoMetodos pm = new ProdutoMetodos();
            pm.buscarProdutos();
            listaProduto = pm.getListaProdutos();
        } catch (Exception e) {
            this.setMensagem(e.getMessage());
            System.out.println(e.getMessage());
        } 
    }
    
    /**
     *
     * Metodo Buscar Mesas
     * Pega mesas do banco
    */
    
    public void buscarMesas() {
        Conexao con = new Conexao();
        try {
            
            con.inicia();
            String query = "SELECT * FROM bars.mesa NATURAL JOIN bars.funcionario,"
                    + "bars.pessoa where bars.funcionario.idpessoa=bars.pessoa.idpessoa order by idmesa";
            ResultSet rs = con.executa(query);
            listaMesa.clear();
            while (rs.next()) {
                Mesa mesa = new Mesa();
                mesa.setIdMesa(Integer.toString(rs.getInt("idmesa")));
                mesa.setIdBar(Integer.toString(rs.getInt("idbar")));
                mesa.setLivre(rs.getBoolean("livre"));
                mesa.getFuncionario().setIdFunc(Integer.toString(rs.getInt("idfunc")));
                mesa.getFuncionario().getPessoa().setNome(rs.getString("nome"));
                listaMesa.add(mesa);
            }
            
            rs.close();
        } catch (Exception e) {
            this.setMensagem(e.getMessage());
            System.out.println(e.getMessage());
        } finally {
            try {
                con.encerra();
            } catch (SQLException closeE) {
                this.setMensagem(closeE.getMessage());
            }
        }
    }
    
    /**
     *
     * Metodo Abrir Conta
     * Cadastra uma nova conta
     * em uma mesa
     * e seta a mesa como ocupada
    */
    
    public void abrirConta(){
        Conexao con = new Conexao();
        try {
            
            con.inicia();
            DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
            Date date = new Date();
            String query = "INSERT INTO bars.conta "
            +"VALUES(" + m.getIdMesa() + "," + m.getIdBar() + ",'" 
            + dateFormat.format(date).toString() +"')";
            con.atualiza(query);
            query =  "UPDATE bars.conta"
                    +" SET idfunc = "+m.getFuncionario().getIdFunc()+" WHERE idmesa = "+m.getIdMesa();
            con.atualiza(query);
            query =  "UPDATE bars.mesa"
                    +" SET livre = 0 WHERE idmesa = "+m.getIdMesa();
            con.atualiza(query);
        } catch (Exception e) {
            this.setMensagem(e.getMessage());
            System.out.println(e.getMessage());
        } finally {
            try {
                con.encerra();
            } catch (SQLException closeE) {
                this.setMensagem(closeE.getMessage());
            }
        }
    }
    
    /**
     *
     * Metodo Realizar Pedidos
     * Cadastra um novo pedido
     * em uma conta existente
     * e calcula quantidade e preco
    */
    
        public void realizarPedido(){
        Conexao con = new Conexao();
        try {
            
            con.inicia();
            String query = "SELECT * FROM bars.conta "
                    + "where idmesa="+getM().getIdMesa();
            ResultSet rs = con.executa(query);
            String idConta="";
            while (rs.next()) {
                idConta=rs.getString("idconta");
            }
            rs.close();
            Produto produto = new Produto();
            query = "SELECT * FROM bars.produto "
                    + "where tipo='"+getTipoProduto()+"'";
            rs = con.executa(query);
            while (rs.next()) {
                produto.setQdade(Integer.toString(rs.getInt("qtd")));
                produto.setIdProduto(rs.getString("idproduto"));
            }
            rs.close();
            int sub = Integer.parseInt(produto.getQdade())-Integer.parseInt(getQtd());
            if(sub>=0){
                query = "INSERT INTO bars.pedido "
                        +"VALUES(" + idConta + "," + produto.getIdProduto() + ","+getQtd()+")";
                con.atualiza(query);
                query =  "UPDATE bars.produto"
                        +" SET qtd = "+sub+" WHERE idproduto = "+produto.getIdProduto();
                con.atualiza(query);
            }else{
                this.setMensagem("NAO_TEM");
            }
            
        } catch (Exception e) {
            this.setMensagem(e.getMessage());
            System.out.println(e.getMessage());
        } finally {
            try {
                con.encerra();
            } catch (SQLException closeE) {
                this.setMensagem(closeE.getMessage());
            }
        }
    }
        
     /**
     *
     * Metodo Encerrar Conta
     * Conta não é apagada, pois é necessária no relatório de venda
         * idmesa = null
         * e seta a mesa como livre
    */
        
    public void encerrarConta(){
        Conexao con = new Conexao();
        try {
            con.inicia();
            String query = "SELECT * FROM bars.conta "
                    + "where idmesa="+getM().getIdMesa();
            ResultSet rs = con.executa(query);
            String idConta="";
            while (rs.next()) {
                idConta=rs.getString("idconta");
            }
            rs.close();
            if(tipoPag.equals("Cheque")){
            query =  "UPDATE bars.conta"
                    +" SET idmesa = null, tipopagamento='"+tipoPag+"', idcliente="+idCliente
                    +" WHERE idconta = "+idConta;
            }else{
            query =  "UPDATE bars.conta"
                    +" SET idmesa = null, tipopagamento='"+tipoPag+"' WHERE idconta = "+idConta;
            }
            con.atualiza(query);
            query =  "UPDATE bars.mesa"
                    +" SET livre = 1 WHERE idmesa = "+m.getIdMesa();
            con.atualiza(query);
        } catch (Exception e) {
            this.setMensagem(e.getMessage());
            System.out.println(e.getMessage());
        } finally {
            try {
                con.encerra();
            } catch (SQLException closeE) {
                this.setMensagem(closeE.getMessage());
            }
        }
    }
    
    /**
     *
     * Metodo Adicionar mesa
     * Adiciona nova mesa ao banco
    */
    
    
    public void addMesa(){
        Conexao con = new Conexao();
        try {
            
            con.inicia();
            String query = "SELECT * FROM bars.mesa "
                    + "where idmesa="+m.getIdMesa();
            ResultSet rs = con.executa(query);
            String idConta="";
            if (rs.next()) {
                mensagem="EXISTE";
            }else{
                query = "INSERT INTO bars.mesa "
                +"VALUES(" + m.getIdMesa() + ",1," 
                + m.getFuncionario().getIdFunc() +",1)";
                con.atualiza(query);
            }
            rs.close();
        } catch (Exception e) {
            this.setMensagem(e.getMessage());
            System.out.println(e.getMessage());
        } finally {
            try {
                con.encerra();
            } catch (SQLException closeE) {
                this.setMensagem(closeE.getMessage());
            }
        }
        
    }
    /**
     *
     * Metodo Edita mesa
     * Edita mesa do banco
    */
    
    
    public void editaMesa(){
        Conexao con = new Conexao();
        try {
            
            con.inicia();
            String query =  "UPDATE bars.mesa"
                    +" SET idfunc = "+m.getFuncionario().getIdFunc()+" WHERE idmesa = "+m.getIdMesa();
            con.atualiza(query);
        } catch (Exception e) {
            this.setMensagem(e.getMessage());
            System.out.println(e.getMessage());
        } finally {
            try {
                con.encerra();
            } catch (SQLException closeE) {
                this.setMensagem(closeE.getMessage());
            }
        }
        
    }
        /**
     *
     * Metodo Remover mesa
     * Remove uma mesa do banco
    */
    
    
    public void removeMesa(){
        Conexao con = new Conexao();
        try {
            
            con.inicia();
            String query = "DELETE FROM bars.mesa "
            +"WHERE idmesa= " + m.getIdMesa();
            con.atualiza(query);
        } catch (Exception e) {
            this.setMensagem(e.getMessage());
            System.out.println(e.getMessage());
        } finally {
            try {
                con.encerra();
            } catch (SQLException closeE) {
                this.setMensagem(closeE.getMessage());
            }
        }
        
    }
    
    /**
     *
     * Metodo Buscar Garçom
     * Pega todos garcons da tabela funcionario
     * e coloca em uma lista
    */
    
    public void buscarGarcom(){
        Conexao con = new Conexao();
        try {
            
            con.inicia();
            String query = "SELECT idfunc,nome FROM bars.funcionario NATURAL JOIN bars.pessoa "
                    + "where upper(cargo) like upper('garcom') order by nome";
            ResultSet rs = con.executa(query);
            listaGarcom.clear();
            while (rs.next()) {
                Funcionario f = new Funcionario();
                f.setIdFunc(Integer.toString(rs.getInt("idfunc")));
                f.getPessoa().setNome(rs.getString("nome"));
                listaGarcom.add(f);
            }
            
            rs.close();
        } catch (Exception e) {
            this.setMensagem(e.getMessage());
            System.out.println(e.getMessage());
        } finally {
            try {
                con.encerra();
            } catch (SQLException closeE) {
                this.setMensagem(closeE.getMessage());
            }
        }
        
    }
    public List getListaProduto() {
        return listaProduto;
    }

    public void setListaProduto(List listaProduto) {
        this.listaProduto = listaProduto;
    }
    public List getListaMesa() {
        return listaMesa;
    }

    public String getTipoProduto() {
        return tipoProduto;
    }

    public void setTipoProduto(String tipoProduto) {
        this.tipoProduto = tipoProduto;
    }

    public void setListaMesa(List listaMesa) {
        this.listaMesa = listaMesa;
    }

    public Mesa getM() {
        return m;
    }

    public void setM(Mesa m) {
        this.m = m;
    }

    public String getMensagem() {
        return mensagem;
    }

    public void setMensagem(String mensagem) {
        this.mensagem = mensagem;
    }

    public String getQtd() {
        return qtd;
    }

    public void setQtd(String qtd) {
        this.qtd = qtd;
    }

    public List getListaPedidos() {
        return listaPedidos;
    }

    public void setListaPedidos(List listaPedidos) {
        this.listaPedidos = listaPedidos;
    }

    public List getListaGarcom() {
        return listaGarcom;
    }

    public void setListaGarcom(List listaGarcom) {
        this.listaGarcom = listaGarcom;
    }

    public String getCpf() {
        return cpf;
    }

    public void setCpf(String cpf) {
        this.cpf = cpf;
    }

    public String getTipoPag() {
        return tipoPag;
    }

    public void setTipoPag(String tipoPag) {
        this.tipoPag = tipoPag;
    }

    public int getIdCliente() {
        return idCliente;
    }

    public void setIdCliente(int idCliente) {
        this.idCliente = idCliente;
    }

   
}
